from flask import Blueprint, jsonify, request
from src.models import Major, db
from ..models.db import get_db
import logging
import traceback

# 配置日志
logger = logging.getLogger(__name__)

major_bp = Blueprint('major', __name__)

@major_bp.route('/', methods=['GET'])
def get_majors():
    """获取所有专业列表"""
    try:
        logger.info("开始获取专业列表")
        conn = get_db()
        cursor = conn.cursor()
        
        # 检查表是否存在
        cursor.execute("""
            SELECT EXISTS (
                SELECT FROM information_schema.tables 
                WHERE table_name = '专业表'
            );
        """)
        table_exists = cursor.fetchone()[0]
        if not table_exists:
            logger.error("专业表不存在")
            return jsonify({
                'status': 'error',
                'message': '专业表不存在'
            }), 500
            
        # 获取专业列表
        cursor.execute("SELECT * FROM 专业表 ORDER BY 专业编号")
        majors = cursor.fetchall()
        logger.info(f"查询到 {len(majors)} 条专业记录")
        
        result = []
        for major in majors:
            major_dict = {
                '专业编号': major[0],
                '专业名称': major[1]
            }
            result.append(major_dict)
            
        return jsonify({
            'status': 'success',
            'data': result
        })
    except Exception as e:
        logger.error(f"获取专业列表失败: {str(e)}")
        logger.error(f"错误详情:\n{traceback.format_exc()}")
        return jsonify({
            'status': 'error',
            'message': str(e)
        }), 500

@major_bp.route('/<string:major_id>', methods=['GET'])
def get_major(major_id):
    """获取指定专业信息"""
    major = Major.query.get_or_404(major_id)
    return jsonify({
        'status': 'success',
        'data': {
            '专业编号': major.专业编号,
            '专业名称': major.专业名称
        }
    })

@major_bp.route('/', methods=['POST'])
def create_major():
    """创建新专业"""
    data = request.get_json()
    
    # 验证数据
    if not data or not data.get('专业编号') or not data.get('专业名称'):
        return jsonify({
            'status': 'error',
            'message': '缺少必要的专业信息'
        }), 400
        
    # 检查专业编号是否已存在
    if Major.query.get(data['专业编号']):
        return jsonify({
            'status': 'error',
            'message': '专业编号已存在'
        }), 400
        
    # 创建新专业
    major = Major(
        专业编号=data['专业编号'],
        专业名称=data['专业名称']
    )
    
    try:
        db.session.add(major)
        db.session.commit()
        return jsonify({
            'status': 'success',
            'message': '专业创建成功',
            'data': {
                '专业编号': major.专业编号,
                '专业名称': major.专业名称
            }
        }), 201
    except Exception as e:
        db.session.rollback()
        return jsonify({
            'status': 'error',
            'message': f'专业创建失败：{str(e)}'
        }), 500

@major_bp.route('/<string:major_id>', methods=['PUT'])
def update_major(major_id):
    """更新专业信息"""
    major = Major.query.get_or_404(major_id)
    data = request.get_json()
    
    if not data:
        return jsonify({
            'status': 'error',
            'message': '未提供更新数据'
        }), 400
        
    # 更新专业名称
    if '专业名称' in data:
        major.专业名称 = data['专业名称']
        
    try:
        db.session.commit()
        return jsonify({
            'status': 'success',
            'message': '专业信息更新成功',
            'data': {
                '专业编号': major.专业编号,
                '专业名称': major.专业名称
            }
        })
    except Exception as e:
        db.session.rollback()
        return jsonify({
            'status': 'error',
            'message': f'专业信息更新失败：{str(e)}'
        }), 500

@major_bp.route('/<string:major_id>', methods=['DELETE'])
def delete_major(major_id):
    """删除专业"""
    major = Major.query.get_or_404(major_id)
    
    try:
        db.session.delete(major)
        db.session.commit()
        return jsonify({
            'status': 'success',
            'message': '专业删除成功'
        })
    except Exception as e:
        db.session.rollback()
        return jsonify({
            'status': 'error',
            'message': f'专业删除失败：{str(e)}'
        }), 500 